package com.whosly.fast.web.quickly.handler;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.util.concurrent.atomic.AtomicLong;

@Component
public class LocalCachehandler {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private final Cache<String, AtomicLong> cache;

    public LocalCachehandler() {
        // 创建Caffeine缓存构建器
        Caffeine<Object, Object> caffeine = Caffeine.newBuilder()
                // 设置写入后10分钟过期
                .expireAfterWrite(Duration.ofMinutes(10))
                // 缓存最大元素数量
                .maximumSize(100000);

        // 构建缓存实例
        this.cache = caffeine.build();
    }

    public long incrementAndGet(String key) {
        // 使用get+null check来达到getIfAbsent和computeIfAbsent的目的
        AtomicLong counter = get(key);

        return counter.incrementAndGet();
    }

    public AtomicLong get(String key) {
        // 注意：上面的代码实际上在每次调用时都会检查缓存，
        // 但只有在键不存在时才会执行mappingFunction， 这是Caffeine的正常行为

        // 如果想要更精细地控制（比如避免每次调用都检查缓存），可能需要使用额外的同步机制
        // （尽管这通常不是必要的，因为Caffeine已经优化了这一点）
        return cache.get(key, k -> new AtomicLong(0));
    }
}
